# # shard_task 是装饰器 可以将普通函数 变成异步任务
# import datetime
#
# from celery import shared_task
#
#
# # 异步任务
# @shared_task()
# def send_mail():
#     print("send mail")
#     return "send mail"  # 任务结果  存储backend  -->redis
#
#
# # 每隔30秒打印一个当前时间
# @shared_task()
# def test_time(name):
#     print('test time')
#     time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
#     print(time)
#     return time
#
#
# def test():
#     print("test")
# shard_task 是装饰器 可以将普通函数 变成异步任务
import smtplib
from celery import shared_task
import datetime
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from django.core.cache import cache
import random


# 异步任务
@shared_task()
# to 是收件人邮箱地址 subject 是邮件主题
def send_mail(to, subject):
    # 设置qq邮箱的配置
    # 注意: 这些是示例配置，实际使用时请替换为您自己的邮件服务器配置
    email_from = "3181444897@qq.com"  # 发件人邮箱
    email_password = 'rblgouuvgmohddac'  # 发件人邮箱密码
    smtp_server = "smtp.qq.com"       # SMTP服务器地址
    smtp_port = 465                       # SMTP服务器端口
    # 创建邮件对象
    msg = MIMEMultipart()
    msg['From'] = email_from
    msg['To'] = to
    msg['Subject'] = subject
    code = str(random.randint(1000, 9999))  # 随机验证码
    # 邮件正文
    # 邮件正文
    body = f"""


            验证码
            您的验证码是: {code}
            此验证码有效期为10分钟。
            如果您没有请求此验证码，请忽略此邮件。


        """
    msg.attach(MIMEText(body, 'html'))

    # 创建邮件对象
    server = smtplib.SMTP_SSL(smtp_server, smtp_port, timeout=30)
    # 登录邮箱
    server.login(email_from, email_password)
    print("正在发送邮件")
    server.sock.settimeout(30)  # 设置套接字超时为30秒
    server.send_message(msg)  # 发送邮件
    server.quit()  # 关闭连接
    # 发送邮件
    return "ok"  # 任务结果  存储backend  -->redis


# 定义第一个任务 负责删除 轮播图缓存
@shared_task()
def delete_cache(keys):
    # cache.delete_many(keys)
    ok = 0
    for i in keys:
        cache.delete(i)
        ok += 1
    return ok


# 第二个任务 负责调用第一个任务延时操作  延时的时间是随机的  这个任务是最终在模型类中调用的
@shared_task()
def delete_cache_delay(keys, time):
    # 推迟调用 delete_cache
    # 利用time 做时间的随机
    # 重新定义一下推迟的时间
    delay = time + random.randint(5, 10)  # 每次推迟的时间都是不一样的 避免了大量任务堆积
    delete_cache.apply_async(args=[keys], countdown=delay)
